package com.panda.cn.config.ReturnValue;

import com.panda.cn.utils.result.R;
import org.springframework.core.MethodParameter;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.method.support.ModelAndViewContainer;

/**
 * 处理程序返回值
 *
 * @author Yanmh
 * @date 2022/09/13
 */
public class ReturnValueHandler implements HandlerMethodReturnValueHandler {
    
    /**
     * 处理程序方法返回值处理程序
     */
    private final HandlerMethodReturnValueHandler handlerMethodReturnValueHandler;
    
    /**
     * 处理程序返回值
     *
     * @param handlerMethodReturnValueHandler 处理程序方法返回值处理程序
     */
    public ReturnValueHandler(HandlerMethodReturnValueHandler handlerMethodReturnValueHandler){
        this.handlerMethodReturnValueHandler = handlerMethodReturnValueHandler;
    }
    
    /**
     * 支持返回类型
     *
     * @param methodParameter 方法参数
     * @return boolean
     */
    @Override
    public boolean supportsReturnType(MethodParameter methodParameter) {
        return this.handlerMethodReturnValueHandler.supportsReturnType(methodParameter);
    }
    
    /**
     * 处理返回值
     *
     * @param returnValue           返回值
     * @param methodParameter       方法参数
     * @param modelAndViewContainer 模型和视图容器
     * @param nativeWebRequest      本地web请求
     * @throws Exception 异常
     */
    @Override
    public void handleReturnValue(Object returnValue, MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest) throws Exception {
        // 判断外层是不是由封装的进行返回
        if(returnValue instanceof R) {
            this.handlerMethodReturnValueHandler.handleReturnValue(returnValue, methodParameter, modelAndViewContainer, nativeWebRequest);
            return;
        }
        this.handlerMethodReturnValueHandler.handleReturnValue(R.success().data(returnValue), methodParameter, modelAndViewContainer, nativeWebRequest);
    }
}
